package tech.shupi.babytapmobile.service

import android.content.Context
import android.util.Log
import java.io.File
import java.io.FileInputStream
import java.io.IOException

/**
 * 文件访问服务
 * 为 Golang 服务器提供 Android 文件系统访问能力
 */
class FileAccessService(private val context: Context) {

    companion object {
        private const val TAG = "FileAccessService"
    }

    /**
     * 检查文件是否存在
     */
    fun fileExists(relativePath: String): Boolean {
        try {
            val file = File(context.filesDir, "golang_data/$relativePath")
            val exists = file.exists()
            Log.d(TAG, "检查文件是否存在: ${file.absolutePath}, 结果: $exists")
            return exists
        } catch (e: Exception) {
            Log.e(TAG, "检查文件是否存在失败: $relativePath", e)
            return false
        }
    }

    /**
     * 获取文件大小
     */
    fun getFileSize(relativePath: String): Long {
        try {
            val file = File(context.filesDir, "golang_data/$relativePath")
            val size = file.length()
            Log.d(TAG, "获取文件大小: ${file.absolutePath}, 大小: $size")
            return size
        } catch (e: Exception) {
            Log.e(TAG, "获取文件大小失败: $relativePath", e)
            return -1
        }
    }

    /**
     * 读取文件内容
     */
    fun readFile(relativePath: String): ByteArray? {
        try {
            val file = File(context.filesDir, "golang_data/$relativePath")
            Log.d(TAG, "读取文件: ${file.absolutePath}")
            
            if (!file.exists()) {
                Log.w(TAG, "文件不存在: ${file.absolutePath}")
                return null
            }

            val inputStream = FileInputStream(file)
            val bytes = inputStream.readBytes()
            inputStream.close()
            
            Log.d(TAG, "文件读取成功: ${file.absolutePath}, 大小: ${bytes.size}")
            return bytes
        } catch (e: Exception) {
            Log.e(TAG, "读取文件失败: $relativePath", e)
            return null
        }
    }

    /**
     * 获取文件的 MIME 类型
     */
    fun getMimeType(relativePath: String): String {
        return when {
            relativePath.endsWith(".jpg", true) || relativePath.endsWith(".jpeg", true) -> "image/jpeg"
            relativePath.endsWith(".png", true) -> "image/png"
            relativePath.endsWith(".gif", true) -> "image/gif"
            relativePath.endsWith(".webp", true) -> "image/webp"
            else -> "application/octet-stream"
        }
    }

    /**
     * 列出目录中的文件
     */
    fun listFiles(relativePath: String): Array<String> {
        try {
            val dir = File(context.filesDir, "golang_data/$relativePath")
            if (!dir.exists() || !dir.isDirectory) {
                Log.w(TAG, "目录不存在或不是目录: ${dir.absolutePath}")
                return emptyArray()
            }

            val files = dir.listFiles()
            val fileNames = files?.map { it.name }?.toTypedArray() ?: emptyArray()
            Log.d(TAG, "列出目录文件: ${dir.absolutePath}, 文件数: ${fileNames.size}")
            return fileNames
        } catch (e: Exception) {
            Log.e(TAG, "列出目录文件失败: $relativePath", e)
            return emptyArray()
        }
    }
} 